#ifndef __LOG_MODULE_H__
#define __LOG_MODULE_H__

#include <stdarg.h>
#include "FreeRTOS.h"
#include "semphr.h"

#ifdef __cplusplus
extern "C" {
#endif

// 日志等级定义 (数值越低优先级越高)
typedef enum
{
    PRINT_FATAL   = 0,  // 致命错误(系统崩溃)
    PRINT_ERROR   = 1,  // 可恢复错误
    PRINT_WARNING = 2,  // 警告
    PRINT_INFO    = 3,  // 运行信息
    PRINT_DEBUG   = 4,  // 调试信息
    PRINT_LEVEL_MAX
} PrintLevel_t;

// 初始化打印模块 (绑定输出设备)
void Print_Init(void (*outputFunc)(const char*));

// 设置全局打印过滤等级
void Print_SetLevel(PrintLevel_t level);

// 设置互斥锁 (FreeRTOS 互斥量句柄)
void Print_SetMutex(SemaphoreHandle_t mutex);

// 核心打印函数 (内部使用)
void Print_Log(PrintLevel_t level, const char* tag, const char* format, ...);

// 等级快捷宏 ---------------------------------------------------
#define PrintFatal(tag, fmt, ...)   Print_Log(PRINT_FATAL,   tag, fmt, ##__VA_ARGS__)
#define PrintError(tag, fmt, ...)   Print_Log(PRINT_ERROR,   tag, fmt, ##__VA_ARGS__)
#define PrintWarning(tag, fmt, ...) Print_Log(PRINT_WARNING, tag, fmt, ##__VA_ARGS__)
#define PrintInfo(tag, fmt, ...)    Print_Log(PRINT_INFO,    tag, fmt, ##__VA_ARGS__)

// 调试日志默认不编译进正式固件
#ifdef DEBUG
    #define PrintDebug(tag, fmt, ...) Print_Log(PRINT_DEBUG, tag, fmt, ##__VA_ARGS__)
#else
    #define PrintDebug(tag, fmt, ...) ((void)0)  // 空宏移除代码
#endif

#ifdef __cplusplus
}
#endif

#endif  // __LOG_MODULE_H__
